package com.code;

/**
 *	多态：
 *		1. 概念：将子类对象装到父类的变量中保存（向上造型/向上转型），当父类变量调用方法的时候，如果子类重写了，会直接执行子类
 *				重写之后的方法。
 *		
 * 		2. 作用：
 * 			1. 可以减少变量声明，减少命名冲突可能性
 * 			2. 可以提高资源利用率，将不用的子类对象及时回收
 * 			3. 可以屏蔽子类差异性，提高代码的扩展性
 * 			
 * 		3. 使用：
 * 			1. 向上造型
 * 					父类类型 	 父类变量 = new 子类类型();
 * 					父类变量.方法();//子类若重写，则会执行子类重写后的方法
 * 
 * 			2. 向下造型/向下转型	=>就是为了调用子类特有方法
 * 					向下造型需要判断当前父类的变量中究竟装的是哪一个子类的对象，即需要类型判断
 * 				
 * 				类型判断方式1：最常用
	 * 				if(父类变量 instanceof 子类类型1){
	 * 					//强制类型转换
	 * 					子类类型1 	子类变量 = (子类类型1)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}else if(父类变量 instanceof 子类类型2){
	 * 					//强制类型转换
	 * 					子类类型2 	子类变量 = (子类类型2)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}...
	 * 
	 * 				类型判断方式2：不常用
	 * 				if(父类变量.getClass() == 子类类型1.class){
	 * 					//强制类型转换
	 * 					子类类型1 	子类变量 = (子类类型1)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}else if(父类变量.getClass() == 子类类型2.class){
	 * 					//强制类型转换
	 * 					子类类型2 	子类变量 = (子类类型2)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}...
 * 				如果不进行类型判断再强转，就有可能发生ClassCastException类造型异常
 * 
 * 		4. 注意事项：
 * 			1. 成员变量没有多态
 * 			2. 不能调用子类特有的方法，如果需要调用子类特有的方法，必须进行强制类型转换（向下造型/向下转型）
 * 				向下造型需要判断当前父类的变量中究竟装的是哪一个子类的对象，即需要类型判断
 * 
 *			3. 父类变量能点（调用）出哪些成员（成员变量和方法），是由当前类和其父类决定,优先从当前类开始查找，直到找到Object了为止，如果Object中有没有，
 *				就不能调用
 *
	 		5. 当父类变量装子类对象时，调用方法的优先级顺序为：
				该优先级为：this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
 */
public class Animal {
	int a = 1;
	public void eat() {
		System.out.println("吃...");
	}
}
